From 28a8fc92e922d22c068e893fa124219bb1b781ad Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 23 Feb 2006 11:24:37 +0100 Subject: [PATCH] Per-vcpu IO evtchn support for VT-i guests (ia64). Signed-off-by Kevin Tian Signed-off-by Xin Li --- xen/arch/ia64/vmx/mmio.c | 4 ++-- xen/arch/ia64/vmx/vmx_init.c | 21 +++++++++++++-------- xen/arch/ia64/vmx/vmx_support.c | 4 ++-- xen/arch/ia64/xen/process.c | 2 +- xen/include/asm-ia64/vmx.h | 4 ++-- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/xen/arch/ia64/vmx/mmio.c b/xen/arch/ia64/vmx/mmio.c index fd06bc14bb..e345754041 100644 --- a/xen/arch/ia64/vmx/mmio.c +++ b/xen/arch/ia64/vmx/mmio.c @@ -154,7 +154,7 @@ static void low_mmio_access(VCPU *vcpu, u64 pa, u64 *val, size_t s, int dir) set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags); p->state = STATE_IOREQ_READY; - evtchn_send(iopacket_port(v->domain)); + evtchn_send(iopacket_port(v)); vmx_wait_io(); if(dir==IOREQ_READ){ //read *val=p->u.data; @@ -187,7 +187,7 @@ static void legacy_io_access(VCPU *vcpu, u64 pa, u64 *val, size_t s, int dir) set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags); p->state = STATE_IOREQ_READY; - evtchn_send(iopacket_port(v->domain)); + evtchn_send(iopacket_port(v)); vmx_wait_io(); if(dir==IOREQ_READ){ //read diff --git a/xen/arch/ia64/vmx/vmx_init.c b/xen/arch/ia64/vmx/vmx_init.c index 16aa37c078..30661e7591 100644 --- a/xen/arch/ia64/vmx/vmx_init.c +++ b/xen/arch/ia64/vmx/vmx_init.c @@ -49,6 +49,7 @@ #include #include #include +#include /* Global flag to identify whether Intel vmx feature is on */ u32 vmx_enabled = 0; @@ -254,9 +255,6 @@ vmx_final_setup_guest(struct vcpu *v) { vpd_t *vpd; - /* Allocate resources for vcpu 0 */ - //memset(&v->arch.arch_vmx, 0, sizeof(struct arch_vmx_struct)); - vpd = alloc_vpd(); ASSERT(vpd); @@ -375,20 +373,15 @@ int vmx_alloc_contig_pages(struct domain *d) void vmx_setup_platform(struct domain *d, struct vcpu_guest_context *c) { - shared_iopage_t *sp; - ASSERT(d != dom0); /* only for non-privileged vti domain */ d->arch.vmx_platform.shared_page_va = __va(__gpa_to_mpa(d, IO_PAGE_START)); - sp = get_sp(d); - //memset((char *)sp,0,PAGE_SIZE); /* TEMP */ d->arch.vmx_platform.pib_base = 0xfee00000UL; /* Only open one port for I/O and interrupt emulation */ memset(&d->shared_info->evtchn_mask[0], 0xff, sizeof(d->shared_info->evtchn_mask)); - clear_bit(iopacket_port(d), &d->shared_info->evtchn_mask[0]); /* Initialize the virtual interrupt lines */ vmx_virq_line_init(d); @@ -397,4 +390,16 @@ void vmx_setup_platform(struct domain *d, struct vcpu_guest_context *c) hvm_vioapic_init(d); } +void vmx_do_launch(struct vcpu *v) +{ + if (evtchn_bind_vcpu(iopacket_port(v), v->vcpu_id) < 0) { + printk("VMX domain bind port %d to vcpu %d failed!\n", + iopacket_port(v), v->vcpu_id); + domain_crash_synchronous(); + } + + clear_bit(iopacket_port(v), + &v->domain->shared_info->evtchn_mask[0]); + vmx_load_all_rr(v); +} diff --git a/xen/arch/ia64/vmx/vmx_support.c b/xen/arch/ia64/vmx/vmx_support.c index e6cd6cefb8..7e353be6c6 100644 --- a/xen/arch/ia64/vmx/vmx_support.c +++ b/xen/arch/ia64/vmx/vmx_support.c @@ -38,7 +38,7 @@ void vmx_wait_io(void) { struct vcpu *v = current; struct domain *d = v->domain; - int port = iopacket_port(d); + int port = iopacket_port(v); do { if (!test_bit(port, @@ -129,7 +129,7 @@ void vmx_intr_assist(struct vcpu *v) struct domain *d = v->domain; extern void vmx_vcpu_pend_batch_interrupt(VCPU *vcpu, unsigned long *pend_irr); - int port = iopacket_port(d); + int port = iopacket_port(v); /* I/O emulation is atomic, so it's impossible to see execution flow * out of vmx_wait_io, when guest is still waiting for response. diff --git a/xen/arch/ia64/xen/process.c b/xen/arch/ia64/xen/process.c index 249b5e93b6..0823c9423f 100644 --- a/xen/arch/ia64/xen/process.c +++ b/xen/arch/ia64/xen/process.c @@ -71,7 +71,7 @@ void schedule_tail(struct vcpu *prev) context_saved(prev); if (VMX_DOMAIN(current)) { - vmx_load_all_rr(current); + vmx_do_launch(current); } else { load_region_regs(current); vcpu_load_kernel_regs(current); diff --git a/xen/include/asm-ia64/vmx.h b/xen/include/asm-ia64/vmx.h index 910cc9b035..91a0e5ebbe 100644 --- a/xen/include/asm-ia64/vmx.h +++ b/xen/include/asm-ia64/vmx.h @@ -40,9 +40,9 @@ static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu) return &((shared_iopage_t *)d->arch.vmx_platform.shared_page_va)->vcpu_iodata[cpu]; } -static inline int iopacket_port(struct domain *d) +static inline int iopacket_port(struct vcpu *v) { - return ((shared_iopage_t *)d->arch.vmx_platform.shared_page_va)->sp_global.eport; + return get_vio(v->domain, v->vcpu_id)->vp_eport; } static inline shared_iopage_t *get_sp(struct domain *d) -- 2.30.2